// 动态内存
// Created by FanGccU on 2025/6/15.
//

#include <iostream>
using namespace std;


/**
 * 什么是栈、推？
 * 栈：在函数内部声明的所有变量都将占用栈空间，函数执行结束后栈空间被释放，自动管理，栈快但小
 *      生命周期：函数作用访范围内
 * 堆：空间很大（受系统内存限制），需要手动管理（new，delete），堆慢但大
 *      生命周期：手动创建和释放
 */

/**
 * 栈
 *
 */
void stackArray() {
    // 函数内定义的变量自动分配在栈中
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    for (int i = 0; i < 10; i++) {
        cout << arr[i] << "\t";
    }
    // 函数执行结束，栈空间被释放
}

/**
 * 堆
 *
 */
void heapArray() {
    // 手动在堆中申请空间
    int *arr = new int[10]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    for (int i = 0; i < 10; i++) {
        cout << arr[i] << "\t";
    }
    // 必须手动释放堆空间
    delete arr;
}

class Box {
public:
    Box() {
        cout << "---调用构造函数！" << endl;
    }

    ~Box() {
        cout << "~~~调用析构函数！" << endl;
    }
};

void objectArray() {
    // 向堆申请内存
    // 如果要为5个的box对象数组分配内存，Box的构造函数将被调用5个，释放时析构函数也会被调用5个
    Box *box = new Box[5];
    delete [] box;
}


class A {
    char *m_cBuffer;

public:
    A() {
        m_cBuffer = new char[10];
    }

    ~A() {
        cout << "destruct" << endl;
        delete [] m_cBuffer;
    }
};

/**
 * 数组对象的释放
 */
void delObjFunc() {
    A *a = new A[10];

    // delete a; // 只会释放数组中的第一个元素，不会释放整个数组

    delete [] a; // 释放整个数组对象
}

int main(int argc, char *argv[]) {
    // stackArray();
    // cout << endl;
    // heapArray();
    // objectArray();
    delObjFunc();
}
